import { toStr } from "../../utils/toString.js";

/**
 * 计算hash code
 * 此方法简单的将字符串中每个字符的ASCII码相加，并除以29，取其余数
 * 此方法太过简单，很容易出现重复
 * @param {string} key
 * @returns {number}
 */
function loseloseHashCode(key) {
  if (typeof key === "number") {
    return key;
  }

  const tableKey = toStr(key);
  let hash = 0;
  // 将字符串中所有字符的ASCII码相加
  for (let i = 0; i < tableKey.length; i++) {
    hash += tableKey.charCodeAt(i);
  }
  // 这里取与一个质数的模，可以很大程度防止重复
  // 这个质数相当于存放hash code数组的大小
  return hash % 29;
}

function djb2HashCode(key) {
  const tableKey = toStr(key);
  let hash = 5381; // 一个大质数
  for (let i = 0; i < tableKey.length; i++) {
    hash = hash * 33 + tableKey.charCodeAt(i);
  }
  return hash % 1013;
}

export { loseloseHashCode, djb2HashCode };
